
#include <head.h>

/*

流水线模拟
在某些流水线式生产系统中，多个工序必须按顺序进行。比如，某个产品需要经过 A -> B -> C 三个工序
每个工序由不同的线程处理。使用信号量可以确保线程按顺序完成各自的工作，模拟一个简单的流水线。\

*/

// 定义无名信号量
sem_t Sem_A;
sem_t Sem_B;
sem_t Sem_C;

// 定义 线程号TID
pthread_t Tid_A;
pthread_t Tid_B;
pthread_t Tid_C;

void *func_A(void *val);
void *func_B(void *val);
void *func_C(void *val);

int main(int argc, char const *argv[])
{
    // 初始化
    sem_init(&Sem_A, 0, 0);
    sem_init(&Sem_B, 0, 0);
    sem_init(&Sem_C, 0, 0);

    // 创建线程
    pthread_create(&Tid_A, NULL, func_A, NULL);
    pthread_create(&Tid_B, NULL, func_B, NULL);
    pthread_create(&Tid_C, NULL, func_C, NULL);

    // V 操作
    sem_post(&Sem_A);


    // 回收线程
    pthread_join(Tid_A, NULL);
    pthread_join(Tid_B, NULL);
    pthread_join(Tid_C, NULL);

    // 销毁无名信号量
    sem_destroy(&Sem_A);
    sem_destroy(&Sem_B);
    sem_destroy(&Sem_C);

    return 0;
}

void *func_A(void *val)
{

    // P操作
    sem_wait(&Sem_A);
    printf("流水线 A 生产中\n");
    sleep(2);
    // V操作 B
    sem_post(&Sem_B);
    return NULL;
}
void *func_B(void *val)
{

    // P操作
    sem_wait(&Sem_B);
    printf("流水线 B 生产中\n");
    sleep(2);
    // V操作 B
    sem_post(&Sem_C);
    return NULL;
}
void *func_C(void *val)
{
    // P操作
    sem_wait(&Sem_C);
    printf("流水线 C 生产中\n");
    sleep(2);
    return NULL;
}
